/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package dao;

import java.io.Serializable;
import java.util.List;
import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;
import dao.ulti.HibernateUtil;

/**
 *
 * @author Nero
 */
public abstract class AbstractDAO<P, K extends Serializable> {

    protected abstract Class getPOJOClass();

    public P Get(K key) throws HibernateException {
        Session session = HibernateUtil.getSessionFactory().openSession();
        P p = (P) session.get(getPOJOClass(), key);
        session.close();
        return p;
    }

    public List<P> GetList() throws HibernateException {
        Session session = HibernateUtil.getSessionFactory().openSession();
        String hql = String.format("select obj from %s obj", getPOJOClass().getName());
        Query query = session.createQuery(hql);
        List<P> list = query.list();
        session.close();
        return list;
    }

    public void SaveOrUpdate(P p) throws HibernateException {
        Session session = HibernateUtil.getSessionFactory().openSession();
        Transaction trans = session.beginTransaction();
        try {
            session.saveOrUpdate(p);
            trans.commit();
        } catch (HibernateException ex) {
            trans.rollback();
            throw ex;
        } finally {
            session.close();
        }
    }

    public void Delete(P p) throws HibernateException {
        Session session = HibernateUtil.getSessionFactory().openSession();
        Transaction trans = session.beginTransaction();
        try {
            session.delete(p);
            trans.commit();
        } catch (HibernateException ex) {
            trans.rollback();
            throw ex;
        } finally {
            session.close();
        }
    }
}
